# 列表
"""
序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置，或索引，第一个索引是0，第二个索引是1，依此类推。
Python有6个序列的内置类型，但最常见的是列表和元组。
序列都可以进行的操作包括索引，切片，加，乘，检查成员。
此外，Python已经内置确定序列的长度以及确定最大和最小的元素的方法。
列表是最常用的Python数据类型，它可以作为一个方括号内的逗号分隔值出现。
列表的数据项不需要具有相同的类型
创建一个列表，只要把逗号分隔的不同的数据项使用方括号括起来即可。
list1 = ['Google', 'Runoob', 1997, 2000]
list2 = [1, 2, 3, 4, 5 ]
list3 = ["a", "b", "c", "d"]
与字符串的索引一样，列表索引从0开始。列表可以进行截取、组合等。
"""


# 访问列表中的值
print('#' * 15 + '访问列表中的值' + '#' * 15)
"""
使用下标索引来访问列表中的值，同样你也可以使用方括号的形式截取字符
"""
list1 = ['Google', 'Runoob', 1997, 2000]
list2 = [1, 2, 3, 4, 5, 6, 7]
print("list1[0]: ", list1[0])
print("list2[1:5]: ", list2[1:5])


# 更新列表
print('#' * 15 + '更新列表' + '#' * 15)
"""
你可以对列表的数据项进行修改或更新，你也可以使用append()方法来添加列表项
"""
list1 = ['Google', 'Runoob', 1997, 2000]
print("第三个元素为 : ", list1[2])
list1[2] = 2001
print("更新后的第三个元素为 : ", list1[2])


# 删除列表元素
print('#' * 15 + '删除列表元素' + '#' * 15)
"""
可以使用 del 语句来删除列表的的元素
"""
print("原始列表 : ", list1)
del list1[2]
print("删除第三个元素 : ", list1)


# Python列表脚本操作符
print('#' * 15 + 'Python列表脚本操作符' + '#' * 15)
"""
列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表，* 号用于重复列表
"""
print(len([1, 2, 3]))  # => 3 => 长度
print([1, 2, 3] + [4, 5, 6])  # => [1, 2, 3, 4, 5, 6] => 组合
print(['Hi!'] * 4	)  # => ['Hi!', 'Hi!', 'Hi!', 'Hi!'[ => 重复
print(3 in [1, 2, 3])  # => True => 元素是否存在
for x in [1, 2, 3]:  # => 1 2 3 => 迭代
    print(x, end=" ")
print()


# Python列表截取与拼接
print('#' * 15 + 'Python列表截取与拼接' + '#' * 15)
"""
Python的列表截取与字符串操作类型
"""
L = ['Google', 'Runoob', 'Taobao']
print(L[2])  # => 'Taobao' => 读取第三个元素
print(L[-2])  # => 'Runoob' => 反向读取，读取倒数第二个元素
print(L[1:])  # => ['Runoob', 'Taobao'] => 截取元素，从第二个开始后的所有元素。


# 嵌套列表
print('#' * 15 + '嵌套列表' + '#' * 15)
"""
使用嵌套列表即在列表里创建其它列表
"""
a = ['a', 'b', 'c']
n = [1, 2, 3]
x = [a, n]
print(x)
print(x[0][1])


# Python列表函数&方法
"""
序号  	函数
1	    len(list)   列表元素个数
2	    max(list)   返回列表元素最大值
3	    min(list)   返回列表元素最小值
4	    list(seq)   将元组转换为列表

序号	    方法
1	    list.append(obj)    在列表末尾添加新的对象
2	    list.count(obj)     统计某个元素在列表中出现的次数
3	    list.extend(seq)    在列表末尾一次性追加另一个序列中的多个值（用新列表扩展原来的列表）
4	    list.index(obj)     从列表中找出某个值第一个匹配项的索引位置
5	    list.insert(index, obj) 将对象插入列表
6	    list.pop([index=-1])    移除列表中的一个元素（默认最后一个元素），并且返回该元素的值
7	    list.remove(obj)    移除列表中某个值的第一个匹配项
8	    list.reverse()  反向列表中元素
9	    list.sort( key=None, reverse=False) 对原列表进行排序
10	    list.clear()    清空列表
11	    list.copy()     复制列表
"""


# Python列表常用操作
print('#' * 15 + 'Python列表常用操作' + '#' * 15)

# list 定义
li = ["a", "b", "mpilgrim", "z", "example"]
print(li)
print(li[1])

# list 负数索引
print(li[-1])
print(li[1:3])
print(li[1:-1])

# list 增加元素
li.append('new')
print(li)
li.insert(2, 'new2')
print(li)
li.extend(['one', 'two'])
print(li)

# list 搜索
print(li.index('new'))
print('c' in li)

# list 删除元素
li.remove('z')
print(li)
li.pop()
print(li)

# list 运算符
li += ['m', 'n']
print(li)
li *= 2
print(li)

# 使用join链接list成为字符串
# join 只能用于元素是字符串的 list; 它不进行任何的类型强制转换。连接一个存在一个或多个非字符串元素的 list 将引发一个异常。
s = ','.join(li)
print(s)

# list 分割字符串
# split 与 join 正好相反, 它将一个字符串分割成多元素 list。
# 注意, 分隔符 (";") 被完全去掉了, 它没有在返回的 list 中的任意元素中出现。
# split 接受一个可选的第二个参数, 它是要分割的次数。
print(s.split(','))

# list 的映射解析
li = [1, 9, 8, 4]
print([elem*2 for elem in li])
print(li)
li = [elem*2 for elem in li]
print(li)

# dictionary 中的解析
params = {"server": "mpilgrim", "database": "master", "uid": "sa", "pwd": "secret"}
print(params.keys())
print(params.values())
print(params.items())
print([k for k, v in params.items()])
print([v for k, v in params.items()])
print(["%s=%s" % (k, v) for k, v in params.items()])

# list 过滤
li = ["a", "mpilgrim", "foo", "b", "c", "b", "d", "d"]
print([elem for elem in li if len(elem) > 1])
print([elem for elem in li if elem != "b"])
print([elem for elem in li if li.count(elem) == 1])
print(li.index('asdsd'))
